分享主軸
- 介紹 Kestrel
- 與 ASP .NET Core 關係
- 簡單提及 IIS
Kestrel是什麼
- 預設伺服器
- ASP .NET Core Run 起來,就可以連接網站,那個 Web Server 名稱就是 Kestrel,內建在 ASP .NET Core內,簡單來說 Kestrel 就是 ASP .NET Core 內建的一套預設的 Web Server。
- 高效能與跨平台
- Kestrel 是一個跨平台的伺服器,這意味著它可以在 Windows、Linux 和 macOS 上運行,它使用異步 I/O 模型,這使得它在處理請求時能夠更有效率。
- 安全性且可與反向代理伺服器的結合
- Kestrel 支持 HTTPS
- 雖然 Kestrel 可以單獨運行,但在正式環境中,通常會將 Kestrel 與反向代理伺服器(如 IIS、Nginx 或 Apache)結合使用。反向代理伺服器接收 HTTP 請求,並將這些請求轉發到 Kestrel,這樣可以提供額外的安全性和負載均衡功能。
總結來說
- Kestrel 是 ASP.NET Core 的內建 Web 伺服器,主要負責處理最基本的 HTTP 請求與回應。然而比如Kestrel 本身並不具備處理靜態文件的能力,例如靜態網頁、圖片或其他資源。如果你需要這些功能,就必須透過 Middleware 來擴充 Kestrel 的能力,如下
var app = builder.Build();
// 使用靜態文件中間件
app.UseStaticFiles();
app.Run();
- ASP .NET Core 的 Kestrel 其實沒有太多特別功能 (它的設計目標是提供最小的開銷和最高的性能,但這也意味著它本身並不具備許多內建功能),要什麼功能得自己在 program.cs 內註冊 Middleware 服務,並不像 IIS 功能那麼齊全。
- 共享 Port 的限制:Kestrel 不能在同一台伺服器上與其他應用共享相同的 Port。因此,在多個應用同時運行時,使用反向代理可以更好地管理不同域名和端口的綁定。
Kestrel 的資源管理問題
- Kestrel 是 ASP.NET Core 的內建 Web 伺服器,主要負責處理基本的 HTTP 請求與回應。然而,Kestrel 本身並不具備自動恢復機制。如果 ASP.NET Core 應用程式在 Kestrel 上運行時發生崩潰,Kestrel 作為一個執行檔(.exe)也會停止運行,無法自動重新啟動
IIS 的 Process Manager 能力
- IIS(Internet Information Services)具有強大的 Process Manager 能力。當 IIS 中的工作進程(w3wp.exe)崩潰時,IIS 會自動監控並重新啟動該進程,確保應用程式的高可用性。這是因為 IIS 內建了一個監控機制,可以自動檢測並恢復崩潰的應用程式集區。
微軟建議將 Kestrel 前放置反向代理伺服器,可以利用反向代理伺服器(如 IIS、Nginx 或 Apache)的資源管理和恢復能力,確保應用程式的高可用性和穩定性( 這只是建議,並非一定)。
補充
- Visual Studio 自動啟動的 Kestrel 透過預設的 CreateDefaultBuilder 配置已經足夠,並且不需要在 Program.cs 中手動設定 Kestrel託管。只有在需要特別配置 Kestrel 行為時,你才需要在 Program.cs 中添加額外的配置,例如要設定特別 IP 或是 限制請求大小或連接數量
// 新增 Kestrel server options
builder.ConfigureKestrel((context, options) =>
{
// 設定 Kestrel 的限制
options.Limits.MaxRequestBodySize = 10 * 1024 * 1024;
// 設定特定的端口和 IP 地址
options.Listen(IPAddress.Parse("127.0.0.1"), 5000);
options.Listen(IPAddress.Parse("192.168.0.1"), 5000);
});
Visual Studio 內的啟動的種類與代表意思
在 Visual Studio 中,綠色的「執行」按鈕旁的選項(如「http」、「https」、「IIS Express」、「WSL」等)代表了不同的執行和除錯方式。以下是各選項的含義
HTTP / HTTPS
Kestrel 會被啟動,直接處理 HTTP 或 HTTPS 請求
- HTTP:使用未加密的 HTTP 協定來執行應用程式。適合本地開發和測試,但安全性較低,不建議在生產環境中使用。
- HTTPS:使用加密的 HTTPS 協定來執行應用程式。提供更高的安全性,尤其在處理敏感資料時應該使用。需要配置 SSL 憑證。
IIS Express
IIS Express 會作為反向代理,後端仍由 Kestrel 處理請求,Kestrel 也會啟動
- IIS Express:這是 Internet Information Services (IIS) 的輕量版,通常用於在 Visual Studio 中本地除錯網頁應用程式。它提供了大多數 IIS 的功能,但設置更簡單,適合開發用途。IIS Express 支援 HTTP 和 HTTPS,並且不需要管理員權限即可運行。( 選擇 IIS Express 來運行應用程式時,表示 Visual Studio 正在模擬 IIS 環境,但這是 IIS 的輕量版,主要用於開發和測試用途 )
WSL (Windows Subsystem for Linux)
Kestrel 會在 WSL 的 Linux 環境中啟動並處理請求
- WSL:這個選項允許你在 Windows 中的 Linux 環境下執行和除錯應用程式。如果你的應用程式最終會部署到 Linux 伺服器,這會非常有用。WSL 提供了一個完整的 Linux 用戶空間,讓你可以在 Windows 上運行 Linux 應用程式。
IIS 與 Kestrel 差異
-
IIS是功能豐富且高效 Web Server,提供方便的操作設定 SSL、HTTP2、gzip、UrlRewrite 等功能,但只能在Windows上運行
-
Kestrel Web Server 則是跨平台,可以在Windows、Linux、MacOS 上運作,支援SSL,但不支援多個應用程式用相同的Port號
-
Kestrel Web Server 只能接受最基本的 Request 與 Response,要有其他功能,必須去擴充方法,使用Middleware,這邊與IIS不同,IIS Web Server 是多功能的
-
Kestrel Web Server 會處理 HTTP 請求並將它們傳遞給 ASP.NET Core 應用程式
-
Kestrel Web Server 沒有自動重啟的功能,所以當應用程式或是Kestrel 掛掉,是沒辦法自動重啟的,這也是 微軟官方建議 Kestrel 外面再擋一層,因為那一層可以幫忙管理 Kestrel 的 Process
- 若要在 IIS上跑 ASP .NET Core應用程式,就得下載 ASP .NET Core Hosting Bundle,此時在IIS模組內可以看到一個叫做 AspNetCoreModuleV2,表示安裝成功
簡單統整一下
- 了解 ASP .NET Core 內建就有一套高效能的 Web Server 與以往 ASP .NET 不同
- 了解 微軟建議 ASP .NET Core 部屬架構會是在 Kestrel 前有一個 Proxy,而不要直接讓 Kestrel 就對外到 Client
- 了解 Kestrel 與 IIS 簡單差異
- 了解 Kestrel 不能在同一台伺服器上與其他應用共享相同的 Port。因此,在多個應用同時運行時,使用反向代理可以更好地管理不同域名和端口的綁定
今日結語
了解 ASP .NET Core 與 Kestrel 關係以及 Kestrel 是什麼 ? 對於在開發 ASP .NET Core 非常有幫助,
順便簡單了解一下 IIS 與之差異。
今日就分享到這邊,希望有幫助到大家,明日繼續努力。